#Boa:Dialog:Compras
 
import wx
import wx.lib.masked.textctrl
import wx.calendar
import wx.grid
import consultasBD
import Altaproductos
import Buscacolor2
import BuscaProdPorDescri
import consultasBD
import utiles
import sincronizar_tabla
import BuscaProveedor  
import Mensaje
import Pagos
from decimal import Decimal
import ChequesAlta
import time
import os
from decimal import Decimal

ROJO = (255, 145, 145, 255)
VERDE = (145, 255, 145, 255)
AZUL = (145, 145, 255, 255)
BLANCO = (255, 255, 255, 255)
AMARILLO = (254, 248, 191, 255)

def create(parent):
    return Compras(parent)

[wxID_COMPRAS, wxID_COMPRASBUTTON1, wxID_COMPRASBUTTON11, wxID_COMPRASBUTTON2, 
 wxID_COMPRASBUTTON3, wxID_COMPRASBUTTON4, wxID_COMPRASBUTTON5, 
 wxID_COMPRASBUTTON6, wxID_COMPRASBUTTON7, wxID_COMPRASBUTTON8, 
 wxID_COMPRASBUTTON9, wxID_COMPRASCHECKBOX1, wxID_COMPRASCHOICE1, 
 wxID_COMPRASCOMBOBOX1, wxID_COMPRASCOMBOBOX2, wxID_COMPRASGRID1, 
 wxID_COMPRASINCANTIDADES, wxID_COMPRASINDESC, wxID_COMPRASINFECHAFACTURA, 
 wxID_COMPRASINIVA, wxID_COMPRASINNOMBREPROVEE, wxID_COMPRASINPROVEEDOR, 
 wxID_COMPRASINSUBTOTAL, wxID_COMPRASINTOTAL, wxID_COMPRASNRO_FACTURA, 
 wxID_COMPRASSTATICBOX1, wxID_COMPRASSTATICTEXT1, wxID_COMPRASSTATICTEXT10, 
 wxID_COMPRASSTATICTEXT11, wxID_COMPRASSTATICTEXT12, wxID_COMPRASSTATICTEXT13, 
 wxID_COMPRASSTATICTEXT14, wxID_COMPRASSTATICTEXT15, wxID_COMPRASSTATICTEXT16, 
 wxID_COMPRASSTATICTEXT17, wxID_COMPRASSTATICTEXT18, wxID_COMPRASSTATICTEXT19, 
 wxID_COMPRASSTATICTEXT2, wxID_COMPRASSTATICTEXT20, wxID_COMPRASSTATICTEXT21, 
 wxID_COMPRASSTATICTEXT22, wxID_COMPRASSTATICTEXT23, wxID_COMPRASSTATICTEXT24, 
 wxID_COMPRASSTATICTEXT3, wxID_COMPRASSTATICTEXT4, wxID_COMPRASSTATICTEXT5, 
 wxID_COMPRASSTATICTEXT6, wxID_COMPRASSTATICTEXT7, wxID_COMPRASSTATICTEXT8, 
 wxID_COMPRASSTATICTEXT9, wxID_COMPRASTEXTCTRL1, wxID_COMPRASTEXTCTRL2, 
 wxID_COMPRASTEXTCTRL3, wxID_COMPRASTEXTCTRL4, wxID_COMPRASTEXTCTRL5, 
 wxID_COMPRASTEXTCTRL6, wxID_COMPRASTEXTCTRL7, wxID_COMPRASTEXTCTRL8, 
 wxID_COMPRASTEXTCTRL9, wxID_COMPRASTEXTNOMBREPROVEE, wxID_COMPRASTOTALTOTAL, 
] = [wx.NewId() for _init_ctrls in range(61)]

class Compras(wx.Dialog):
    modificables = (0,3,4,5,6)
    
    def _init_ctrls(self, prnt):
        # generated method, don't edit
        wx.Dialog.__init__(self, id=wxID_COMPRAS, name='', parent=prnt,
              pos=wx.Point(38, 12), size=wx.Size(860, 582),
              style=wx.DEFAULT_DIALOG_STYLE, title='Ingreso de Compras')
        self.SetClientSize(wx.Size(852, 555))

        self.inproveedor = wx.TextCtrl(id=wxID_COMPRASINPROVEEDOR,
              name='inproveedor', parent=self, pos=wx.Point(16, 24),
              size=wx.Size(72, 22), style=0, value='')

        self.inNombreProvee = wx.TextCtrl(id=wxID_COMPRASINNOMBREPROVEE,
              name='inNombreProvee', parent=self, pos=wx.Point(88, 24),
              size=wx.Size(192, 22), style=0, value='')
        self.inNombreProvee.SetEditable(True)

        self.button1 = wx.Button(id=wxID_COMPRASBUTTON1, label='Buscar',
              name='button1', parent=self, pos=wx.Point(88, 48),
              size=wx.Size(48, 22), style=0)
        self.button1.Bind(wx.EVT_BUTTON, self.OnBuscarProveedorButton,
              id=wxID_COMPRASBUTTON1)

        self.button6 = wx.Button(id=wxID_COMPRASBUTTON6, label='Ver',
              name='button6', parent=self, pos=wx.Point(136, 48),
              size=wx.Size(48, 22), style=0)
        self.button6.Bind(wx.EVT_BUTTON, self.OnVerProveedor,
              id=wxID_COMPRASBUTTON6)

        self.button11 = wx.Button(id=wxID_COMPRASBUTTON11, label='Modif',
              name='button11', parent=self, pos=wx.Point(184, 48),
              size=wx.Size(48, 22), style=0)
        self.button11.Bind(wx.EVT_BUTTON, self.OnModificarProveedor,
              id=wxID_COMPRASBUTTON11)

        self.button9 = wx.Button(id=wxID_COMPRASBUTTON9, label='Alta',
              name='button9', parent=self, pos=wx.Point(232, 48),
              size=wx.Size(48, 22), style=0)
        self.button9.Bind(wx.EVT_BUTTON, self.OnAltaProveedor,
              id=wxID_COMPRASBUTTON9)

        self.comboBox2 = wx.ComboBox(choices=[], id=wxID_COMPRASCOMBOBOX2,
              name='comboBox2', parent=self, pos=wx.Point(304, 24),
              size=wx.Size(112, 21), style=0, value='')
        self.comboBox2.SetLabel('')
        self.comboBox2.Bind(wx.EVT_COMBOBOX, self.OnCambiaComboTipoDocumento,
              id=wxID_COMPRASCOMBOBOX2)

        self.checkBox1 = wx.CheckBox(id=wxID_COMPRASCHECKBOX1,
              label='Doc.Interno', name='checkBox1', parent=self,
              pos=wx.Point(304, 48), size=wx.Size(104, 13), style=0)
        self.checkBox1.SetValue(False)
        self.checkBox1.SetHelpText('Tildado, el documento no se considera para calcular el saldo del proveedor.')
        self.checkBox1.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.BOLD, False,
              'Tahoma'))
        self.checkBox1.Show(False)
        self.checkBox1.Bind(wx.EVT_HELP, self.OnCheckBox1Help,
              id=wxID_COMPRASCHECKBOX1)

        self.nro_factura = wx.TextCtrl(id=wxID_COMPRASNRO_FACTURA,
              name=u'nro_factura', parent=self, pos=wx.Point(416, 24),
              size=wx.Size(80, 21), style=wx.TE_RIGHT | wx.TE_LEFT, value=u'')

        self.textCtrl2 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL2, name='textCtrl2',
              parent=self, pos=wx.Point(496, 24), size=wx.Size(64, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.textCtrl2.Bind(wx.EVT_KILL_FOCUS, self.OnSaltoTotal)

        self.staticText4 = wx.StaticText(id=wxID_COMPRASSTATICTEXT4,
              label='Total', name='staticText4', parent=self, pos=wx.Point(496,
              8), size=wx.Size(24, 13), style=0)

        self.infechafactura = wx.DatePickerCtrl(id=wxID_COMPRASINFECHAFACTURA,
              name='infechafactura', parent=self, pos=wx.Point(560, 24),
              size=wx.Size(85, 21), style=wx.DP_DROPDOWN | wx.DP_SHOWCENTURY)

        self.textCtrl1 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL1, name='textCtrl1',
              parent=self, pos=wx.Point(648, 24), size=wx.Size(72, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='')
        self.textCtrl1.SetEditable(False)

        self.comboBox1 = wx.ComboBox(choices=[], id=wxID_COMPRASCOMBOBOX1,
              name='comboBox1', parent=self, pos=wx.Point(720, 24),
              size=wx.Size(130, 21), style=0, value='')
        self.comboBox1.SetLabel('')

        self.staticText11 = wx.StaticText(id=wxID_COMPRASSTATICTEXT11,
              label='Nro Doc.', name='staticText11', parent=self,
              pos=wx.Point(416, 8), size=wx.Size(42, 13), style=0)

        self.staticText2 = wx.StaticText(id=wxID_COMPRASSTATICTEXT2,
              label='Fecha Doc', name='staticText2', parent=self,
              pos=wx.Point(560, 8), size=wx.Size(50, 13), style=0)

        self.staticText1 = wx.StaticText(id=wxID_COMPRASSTATICTEXT1,
              label='Fecha ingreso', name='staticText1', parent=self,
              pos=wx.Point(648, 8), size=wx.Size(67, 13), style=0)

        self.staticText14 = wx.StaticText(id=wxID_COMPRASSTATICTEXT14,
              label='Temporada', name='staticText14', parent=self,
              pos=wx.Point(720, 8), size=wx.Size(54, 13), style=0)

        self.button4 = wx.Button(id=wxID_COMPRASBUTTON4, label='Aceptar',
              name='button4', parent=self, pos=wx.Point(776, 55),
              size=wx.Size(72, 23), style=0)
        self.button4.Bind(wx.EVT_BUTTON, self.OnAceptar, id=wxID_COMPRASBUTTON4)

        self.grid1 = wx.grid.Grid(id=wxID_COMPRASGRID1, name='grid1',
              parent=self, pos=wx.Point(8, 96), size=wx.Size(840, 312),
              style=0)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
              self.OnGrid1GridCellChange)

        self.staticText5 = wx.StaticText(id=wxID_COMPRASSTATICTEXT5,
              label='Cant. Art', name='staticText5', parent=self,
              pos=wx.Point(182, 418), size=wx.Size(45, 13), style=0)

        self.staticText6 = wx.StaticText(id=wxID_COMPRASSTATICTEXT6,
              label='sin IVA', name='staticText6', parent=self,
              pos=wx.Point(256, 418), size=wx.Size(33, 13), style=0)

        self.staticText22 = wx.StaticText(id=wxID_COMPRASSTATICTEXT22,
              label='% Descuento', name='staticText22', parent=self,
              pos=wx.Point(320, 418), size=wx.Size(65, 13), style=0)

        self.staticText23 = wx.StaticText(id=wxID_COMPRASSTATICTEXT23,
              label='$', name='staticText23', parent=self, pos=wx.Point(320,
              456), size=wx.Size(6, 13), style=0)

        self.staticText8 = wx.StaticText(id=wxID_COMPRASSTATICTEXT8,
              label='IVA', name='staticText8', parent=self, pos=wx.Point(471,
              418), size=wx.Size(17, 13), style=0)

        self.button7 = wx.Button(id=wxID_COMPRASBUTTON7,
              label='Articulo Sussan', name='button7', parent=self,
              pos=wx.Point(8, 416), size=wx.Size(96, 23), style=0)
        self.button7.Bind(wx.EVT_BUTTON, self.OnBuscarArticuloSussan,
              id=wxID_COMPRASBUTTON7)

        self.button8 = wx.Button(id=wxID_COMPRASBUTTON8, label='Art. Proveedor',
              name='button8', parent=self, pos=wx.Point(8, 440),
              size=wx.Size(96, 23), style=0)
        self.button8.Bind(wx.EVT_BUTTON, self.OnBuscarArticuloProveedor,
              id=wxID_COMPRASBUTTON8)

        self.incantidades = wx.TextCtrl(id=wxID_COMPRASINCANTIDADES,
              name='incantidades', parent=self, pos=wx.Point(182, 432),
              size=wx.Size(48, 21), style=wx.TE_RIGHT | wx.TE_LEFT, value='0')
        self.incantidades.Enable(True)
        self.incantidades.SetEditable(False)

        self.textCtrl9 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL9, name='textCtrl9',
              parent=self, pos=wx.Point(256, 432), size=wx.Size(64, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.textCtrl9.SetEditable(False)

        self.textCtrl7 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL7, name='textCtrl7',
              parent=self, pos=wx.Point(328, 432), size=wx.Size(64, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.textCtrl7.Bind(wx.EVT_KILL_FOCUS, self.OnDescSinIVAporcentaje)

        self.textCtrl8 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL8, name='textCtrl8',
              parent=self, pos=wx.Point(328, 456), size=wx.Size(64, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.textCtrl8.Bind(wx.EVT_KILL_FOCUS, self.OnDescSinIVAmonto)

        self.insubtotal = wx.TextCtrl(id=wxID_COMPRASINSUBTOTAL,
              name='insubtotal', parent=self, pos=wx.Point(400, 432),
              size=wx.Size(64, 21), style=wx.TE_RIGHT | wx.TE_LEFT,
              value='0.00')
        self.insubtotal.Enable(True)
        self.insubtotal.SetEditable(False)

        self.iniva = wx.TextCtrl(id=wxID_COMPRASINIVA, name='iniva',
              parent=self, pos=wx.Point(471, 432), size=wx.Size(62, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.iniva.SetEditable(False)

        self.textCtrl4 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL4, name='textCtrl4',
              parent=self, pos=wx.Point(472, 456), size=wx.Size(62, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.textCtrl4.Bind(wx.EVT_KILL_FOCUS, self.OnRecalculaIVA)

        self.choice1 = wx.Choice(choices=["21.00", "10.50"],
              id=wxID_COMPRASCHOICE1, name='choice1', parent=self,
              pos=wx.Point(536, 432), size=wx.Size(56, 21), style=0)
        self.choice1.Bind(wx.EVT_CHOICE, self.OnCambiaPorcentaje,
              id=wxID_COMPRASCHOICE1)

        self.intotal = wx.TextCtrl(id=wxID_COMPRASINTOTAL, name='intotal',
              parent=self, pos=wx.Point(592, 432), size=wx.Size(66, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.intotal.SetFont(wx.Font(8, wx.SWISS, wx.NORMAL, wx.NORMAL, False,
              'Tahoma'))
        self.intotal.SetEditable(False)

        self.textCtrl5 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL5, name='textCtrl5',
              parent=self, pos=wx.Point(592, 456), size=wx.Size(66, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.textCtrl5.Bind(wx.EVT_KILL_FOCUS, self.OnRecalculaSubtotal)

        self.indesc = wx.TextCtrl(id=wxID_COMPRASINDESC, name='indesc',
              parent=self, pos=wx.Point(702, 432), size=wx.Size(64, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.indesc.Bind(wx.EVT_KILL_FOCUS, self.OnDescuentoPerderFoco)

        self.textCtrl6 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL6, name='textCtrl6',
              parent=self, pos=wx.Point(702, 456), size=wx.Size(64, 21),
              style=wx.TE_RIGHT | wx.TE_LEFT, value='0.00')
        self.textCtrl6.Bind(wx.EVT_KILL_FOCUS, self.OnRecalculaDescuento)

        self.totaltotal = wx.TextCtrl(id=wxID_COMPRASTOTALTOTAL,
              name='totaltotal', parent=self, pos=wx.Point(780, 432),
              size=wx.Size(66, 21), style=wx.TE_RIGHT | wx.TE_LEFT,
              value='0.00')
        self.totaltotal.SetEditable(False)

        self.textCtrl3 = wx.TextCtrl(id=wxID_COMPRASTEXTCTRL3, name='textCtrl3',
              parent=self, pos=wx.Point(184, 496), size=wx.Size(568, 21),
              style=0, value='')
        self.textCtrl3.Bind(wx.EVT_KILL_FOCUS, self.OnKillObservaciones)

        self.staticText7 = wx.StaticText(id=wxID_COMPRASSTATICTEXT7,
              label='Sub-Total', name='staticText7', parent=self,
              pos=wx.Point(592, 418), size=wx.Size(46, 13), style=0)

        self.textNombreProvee = wx.StaticText(id=wxID_COMPRASTEXTNOMBREPROVEE,
              label='', name='textNombreProvee', parent=self, pos=wx.Point(520,
              48), size=wx.Size(0, 13), style=0)

        self.staticText12 = wx.StaticText(id=wxID_COMPRASSTATICTEXT12,
              label='Desc.% c/IVA', name='staticText12', parent=self,
              pos=wx.Point(702, 418), size=wx.Size(67, 13), style=0)

        self.staticText13 = wx.StaticText(id=wxID_COMPRASSTATICTEXT13,
              label='Total', name='staticText13', parent=self, pos=wx.Point(782,
              418), size=wx.Size(24, 13), style=0)

        self.button2 = wx.Button(id=wxID_COMPRASBUTTON2, label=u'Guardar',
              name='button2', parent=self, pos=wx.Point(776, 496),
              size=wx.Size(72, 23), style=0)
        self.button2.Bind(wx.EVT_BUTTON, self.OnGuardar, id=wxID_COMPRASBUTTON2)

        self.staticBox1 = wx.StaticBox(id=wxID_COMPRASSTATICBOX1,
              label='Nro.Proveedor Nombre Proveedor', name='staticBox1',
              parent=self, pos=wx.Point(8, 6), size=wx.Size(288, 80), style=0)

        self.staticText3 = wx.StaticText(id=wxID_COMPRASSTATICTEXT3,
              label='? - Buscar cod. art. proveedor', name='staticText3',
              parent=self, pos=wx.Point(8, 536), size=wx.Size(145, 13),
              style=0)

        self.staticText15 = wx.StaticText(id=wxID_COMPRASSTATICTEXT15,
              label='* en cod. art. proveedor => Devolucion',
              name='staticText15', parent=self, pos=wx.Point(376, 536),
              size=wx.Size(193, 13), style=0)

        self.staticText16 = wx.StaticText(id=wxID_COMPRASSTATICTEXT16,
              label='Tipo documento', name='staticText16', parent=self,
              pos=wx.Point(304, 8), size=wx.Size(76, 13), style=0)

        self.staticText17 = wx.StaticText(id=wxID_COMPRASSTATICTEXT17,
              label='ajuste - modifica importe', name='staticText17',
              parent=self, pos=wx.Point(600, 536), size=wx.Size(118, 13),
              style=0)

        self.staticText9 = wx.StaticText(id=wxID_COMPRASSTATICTEXT9,
              label='+ en cod.art.proveedor => NO SUMA', name='staticText9',
              parent=self, pos=wx.Point(168, 536), size=wx.Size(183, 13),
              style=0)

        self.staticText10 = wx.StaticText(id=wxID_COMPRASSTATICTEXT10,
              label='%', name='staticText10', parent=self, pos=wx.Point(536,
              418), size=wx.Size(11, 13), style=0)

        self.staticText18 = wx.StaticText(id=wxID_COMPRASSTATICTEXT18,
              label='Observaciones', name='staticText18', parent=self,
              pos=wx.Point(184, 480), size=wx.Size(71, 13), style=0)

        self.staticText19 = wx.StaticText(id=wxID_COMPRASSTATICTEXT19,
              label='$', name='staticText19', parent=self, pos=wx.Point(464,
              456), size=wx.Size(6, 13), style=0)

        self.staticText20 = wx.StaticText(id=wxID_COMPRASSTATICTEXT20,
              label='$', name='staticText20', parent=self, pos=wx.Point(584,
              456), size=wx.Size(6, 13), style=0)

        self.staticText21 = wx.StaticText(id=wxID_COMPRASSTATICTEXT21,
              label='$', name='staticText21', parent=self, pos=wx.Point(696,
              456), size=wx.Size(6, 13), style=0)

        self.staticText24 = wx.StaticText(id=wxID_COMPRASSTATICTEXT24,
              label='s/IVA c/Desc', name='staticText24', parent=self,
              pos=wx.Point(400, 418), size=wx.Size(61, 13), style=0)

        self.button3 = wx.Button(id=wxID_COMPRASBUTTON3,
              label='Modif.CodSussan', name='button3', parent=self,
              pos=wx.Point(8, 464), size=wx.Size(96, 23), style=0)
        self.button3.Bind(wx.EVT_BUTTON, self.OnModificarProducto,
              id=wxID_COMPRASBUTTON3)

        self.button5 = wx.Button(id=wxID_COMPRASBUTTON5, label='Salir',
              name='button5', parent=self, pos=wx.Point(776, 528),
              size=wx.Size(72, 23), style=0)
        self.button5.Bind(wx.EVT_BUTTON, self.OnSalir, id=wxID_COMPRASBUTTON5)

    def __init__(self, parent):        
        self._init_ctrls(parent)
        self.sucursal = utiles.getSucursalActiva()
        self.grillafactura()
        self.textCtrl1.SetLabel(utiles.obtenerFecha("d/m/Y"))
        #self.radioButton1.SetValue(False)
        #self.radioButton2.SetValue(False)
        self.llenarCombo()
        self.verificarInterrupcion()
        self.choice1.SetSelection(0)

    def llenarCombo(self):
        anio = int(utiles.obtenerFecha("Y-m-d")[:4])
        mes = int(utiles.obtenerFecha("Y-m-d")[5:7])
        dia = int(utiles.obtenerFecha("Y-m-d")[-2:])
        anioanterior = anio -1
        anioactual = anio
        aniosiguiente = anio + 1
        self.comboBox1.Append("INVIERNO"+str(anioanterior))
        self.comboBox1.Append("VERANO"+str(anioanterior))
        self.comboBox1.Append("INVIERNO"+str(anioactual))
        self.comboBox1.Append("VERANO"+str(anioactual))
        self.comboBox1.Append("INVIERNO"+str(aniosiguiente))
        self.comboBox1.Append("VERANO"+str(aniosiguiente))
        self.comboBox1.SetEditable(False)
##        #Este codigo de IF permite setear automaticamente la temporada
##        if mes < 8: #invierno
##            self.comboBox1.SetSelection(2)
##        else: #verano
##            self.comboBox1.SetSelection(3)
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        self.comboBox2.Append("Factura A") # 0
        self.comboBox2.Append("Factura C") # 1
        self.comboBox2.Append("Remito 1") # 2
        self.comboBox2.Append("Remito 2") # 3
        self.comboBox2.Append("Nota de Credito") # 4
        self.comboBox2.Append("Nota de Debito") # 5
        self.comboBox2.Append("Otros (tipo 2)") # 6
        self.comboBox2.Append("Credito (en 2)") # 7
        self.comboBox2.SetEditable(False)
        
    def verificaEncabezado(self):
        self.idproveedor = self.inproveedor.GetLabel()
        self.nrofactura = self.nro_factura.GetLabel()
        aux = self.infechafactura.GetLabel()
        self.fechafactura = aux[-4:]+"-"+aux[3:5]+"-"+aux[:2]+" 00:00:00"
        self.fechaingreso = utiles.obtenerFecha("Y-m-d h:m:s")
        aux1 = self.infechafactura.GetLabel()
        fechafactura = aux[-4:]+aux[3:5]+aux[:2]
        aux2 = utiles.obtenerFecha("Y-m-d")
        fechaingreso = aux2.replace("-","")
        self.temporada = self.comboBox1.GetLabel()
        self.valorfactura = self.textCtrl2.GetLabel()

        if self.comboBox2.GetLabel()=="":
            utiles.mensaje(None,"Debe especificar el tipo de documento")
            self.comboBox2.SetFocus()
            return
        if self.valorfactura == "":
            texto = "Debe informar el importe"
            texto+= "del documento"
            utiles.mensaje(None,texto)
            self.textCtrl2.SetFocus()
            return False
        if fechafactura>fechaingreso:
            texto = "Fecha del Documento no puede\n"
            texto+= "ser posterior a la fecha actual."
            utiles.mensaje(None,texto)
            self.infechafactura.SetFocus()
            return False
        if fechafactura==fechaingreso:
            import Dialog2
            texto = "ATENCION: \n\n"
            texto+= "La Fecha del Documento es igual a la Fecha de Ingreso.\n"
            texto+= "Es correcto?\n\n\n"
            texto+= "ACEPTAR = si                    CANCELAR = no"
            confirma = Dialog2.Dialog2(self, texto, default="no")
            try:
                confirma.ShowModal()
                if not confirma.getSeleccion():
                    return
            finally:
                pass
        if self.idproveedor=="":
            utiles.mensaje(None,"Debe ingresar codigo de proveedor")
            self.inproveedor.SetFocus()
            return False
        if self.nrofactura=="":
            utiles.mensaje(None,"Debe ingresar Nro. de Documento")
            self.nro_factura.SetFocus()
            return False
        if self.temporada=="":
            utiles.mensaje(None,"Debe seleccionar una temporada")
            self.comboBox1.SetFocus()
            return False
        r1 = "SELECT idproveedor FROM proveedor "
        r2 = "WHERE idproveedor='"+self.idproveedor+"'"
        consultaSQL = r1+r2
        resultado = consultasBD.ordenCruda(consultaSQL)
        if resultado == () or resultado == None:
            utiles.mensaje(None,"Codigo de proveedor inexistente")
            self.inproveedor.SetLabel("")
            self.inNombreProvee.SetLabel("")
            self.inproveedor.SetFocus()
            return False
        r1 = "SELECT nrofactura FROM compras "
        r2 = "WHERE idproveedor='"+self.idproveedor+"' AND nrofactura='"+self.nrofactura+"'"
        consultaSQL = r1+r2
        resultado = consultasBD.ordenCruda(consultaSQL)
        if resultado != None:
            if len(resultado)>0:
                utiles.mensaje(None,"Ya existe ese Documento para el proveedor ingresado")
                self.nro_factura.SetFocus()
                return False
        else:
            utiles.mensaje(None,"Error en la lectura ID provedor/Nro Documento")
            self.inproveedor.SetFocus()
            return False
        return True

    def limpiar(self):
        self.inproveedor.SetLabel("")
        self.inNombreProvee.SetLabel("")
        self.nro_factura.SetLabel("")
        self.grid1.ClearGrid()
        for fila in xrange(self.grid1.GetNumberRows()):
            self.grid1.DeleteRows()
        self.grid1.AppendRows()
        self.actualizaSubtotal()
        self.autosizegrilla()
        self.comboBox1.SetSelection(0)
        self.comboBox2.SetSelection(0)
        self.textCtrl2.SetLabel("")
        self.grid1.Refresh()
        self.comboBox1.SetSelection(-1)
        self.comboBox2.SetSelection(-1)
        self.infechafactura.SetLabel("")
        self.choice1.SetSelection(0)
        self.incantidades.SetLabel("0")
        self.textCtrl9.SetLabel("0.00")
        self.textCtrl7.SetLabel("0.00")
        self.textCtrl8.SetLabel("0.00")
        self.insubtotal.SetLabel("0.00")
        self.iniva.SetLabel("0.00")
        self.textCtrl4.SetLabel("0.00")
        self.intotal.SetLabel("0.00")
        self.textCtrl5.SetLabel("0.00")
        self.indesc.SetLabel("0.00")
        self.textCtrl6.SetLabel("0.00")
        self.totaltotal.SetLabel("0.00")
        try:
            os.remove("Compras2.txt")
        except:
            print "Archivo temporal inexistente"
            
    def habilitaEncabezado(self,habilita=True):
        self.inproveedor.Enable(habilita)
        self.inNombreProvee.Enable(habilita)
        self.button1.Enable(habilita)
        self.button6.Enable(habilita)
        self.button11.Enable(habilita)
        self.button9.Enable(habilita)
        self.nro_factura.Enable(habilita)
        self.infechafactura.Enable(habilita)
        self.textCtrl1.Enable(habilita)
        self.textCtrl2.Enable(True)
        self.comboBox1.Enable(habilita)
        self.comboBox2.Enable(habilita)
        self.grid1.EnableEditing(not habilita)
        self.button2.Enable(not habilita)
        self.button7.Enable(not habilita)
        self.button8.Enable(not habilita)
        self.incantidades.Enable(not habilita)
        self.indesc.Enable(not habilita)
        self.insubtotal.Enable(not habilita)
        self.iniva.Enable(not habilita)
        self.intotal.Enable(not habilita)
        self.totaltotal.Enable(not habilita)
        self.textCtrl4.Enable(not habilita)
        self.textCtrl5.Enable(not habilita)
        self.textCtrl6.Enable(not habilita)
        self.textCtrl7.Enable(not habilita)
        self.textCtrl8.Enable(not habilita)
        self.textCtrl9.Enable(not habilita)
        self.choice1.Enable(not habilita)
        if habilita:
            self.button4.SetLabel("Aceptar")
            self.inproveedor.SetFocus()
        else:
            self.button4.SetLabel("Limpiar")
            self.grid1.SetFocus()

    def OnBuscarArticuloSussan(self, event):
##        import BuscarArticuloPorProveedor
##        dlg = BuscarArticuloPorProveedor.Dialog1(self,self.inproveedor.GetLabel())
##        try:
##            dlg.ShowModal()
##        finally:
##            dlg.Destroy()
        fila = self.grid1.GetGridCursorRow()
        columna = self.grid1.GetGridCursorCol()
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        codsussan = self.grid1.GetCellValue(fila,1)
        import BuscarArticulo3
        appBack = BuscarArticulo3.create(None,codsussan=codsussan)
        appBack.Show()
        return


    def OnBuscarArticuloProveedor(self, event):
        if self.inproveedor.GetLabel() == "":
            self.inproveedor.SetFocus()
            return
        dlg = BuscaProdPorDescri.BuscarDescrip(self, self.inproveedor.GetLabel())
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy()

    def OnAltaProveedor(self, event):
        import AltaProveedores
        dlg = AltaProveedores.Dialog1(self)
        try:
            dlg.ShowModal()
            micodigo = dlg.codigoProveedor
        finally:
            dlg.Destroy()
        if micodigo<>"":
            self.inproveedor.SetLabel(micodigo)
            self.OnBuscarProveedorButton(None)
            self.nro_factura.SetFocus()

    def OnAjustar(self, event):
        self.autosizegrilla()
        self.grid1.SetFocus()

    def OnAceptar(self, event, pregunta=True):
        if self.button4.GetLabel() == "Limpiar":
            if pregunta:
                import Dialog2
                texto = "ATENCION: \n\n"
                texto+= "Se perderan los datos cargados en pantalla.\n"
                texto+= "Desea proceder?\n\n\n"
                texto+= "ACEPTAR = si                    CANCELAR = no"
                confirma = Dialog2.Dialog2(self, texto, default="no")
                confirma.ShowModal()
                if not confirma.getSeleccion(): return
            self.habilitaEncabezado(True)
            self.limpiar()
            return
        if not self.verificaEncabezado():
            return
        self.habilitaEncabezado(False)

    def autosizegrilla(self):
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,None)
        for i in xrange(self.grid1.GetNumberCols()):
            self.grid1.AutoSizeColumn(i,True)
        self.grid1.Refresh()
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,self.OnGrid1GridCellChange)
        
    def grillafactura(self):
        #Cod Art Prov,Cod Sussan,Descri,Cant,$ Costo,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        columnas =['Codigo Articulo\nProveedor','Codigo\nSussan','Descripcion',\
                   'Cantidad','$ Costo\nUnitario','Subtotal','Iva','Total','Precio\nVenta']
        self.grid1.CreateGrid(1,len(columnas))
        
        for i, col in enumerate(columnas): 
            self.grid1.SetColLabelValue(i, col)
        self.autosizegrilla()

        self.grid1.EnableEditing(False)
            
        self.total = "" 
        self.grid1.SetSelectionMode(wx.grid.Grid.wxGridSelectRows)
        
    def _buscar(self, codartprov,fil):
        '''Dada un codigo de producto intenta encontrarlo en la bd y devolverlo'''
        proveedor = self.inproveedor.Value
        r1 = "SELECT * FROM productos p "
        r2 = "JOIN producto_codartprov cb ON (p.codsussan = cb.codsussan) "
        r3 = "WHERE p.proveedor = '%s' AND cb.codartprov LIKE '%s'" % (proveedor, codartprov)
        sql = r1+r2+r3
        resultados = consultasBD.ordenCrudaDict(sql)
        return resultados
    
    def _buscar_interactivo(self):
        '''Abre el dialogo de busqueda de productos'''
        proveedor = self.inproveedor.Value
        dlg = BuscaProdPorDescri.BuscarDescrip(self, proveedor)
        try:
            dlg.ShowModal()
            codsussan = dlg.Muestraid()
        finally:
            dlg.Destroy()        
        return codsussan
    
    def _asociar_codsussan_codbarra(self, codartprov, codsussan):
        '''Agrega una fila en la BD asociando el codsussan con un codigo de barra del proveedor'''
        r1 = "INSERT INTO producto_codartprov (codartprov, codsussan)"
        r2 = "VALUES ('%s', '%s')" % (codartprov, codsussan)
        sql = r1+r2
        consultasBD.executa(None, sql)
    
    def _alta_interactivo(self, codartprov=""):
        '''Se abre el dialogo para dar de alta un producto'''
        #lo llamo con el proveedor y el cod del articulo nuevo
        cod_prov = str(self.inproveedor.Value)
        temporada = self.comboBox1.GetLabel()
        dlg = Altaproductos.Altaproductos(self, cod_prov, codartprov,1,temporada) #el 1 significa que es un alta por COMPRAS y ya precarga los valores en los campos del form.
        try:
            dlg.ShowModal() #inserta el art. y luego trae el resultado a la grilla
            return dlg.get_codsussan()
        finally:
            dlg.Destroy()

    def _mostrar_articulo_en_grilla(self, fila, articulo, nosuma=False):
        '''Muestra un articulo en la fila dada'''
        fil = self.grid1.GetGridCursorRow()
        #fil = fila
        if "*" in self.grid1.GetCellValue(fil,0):
            print "Articulo para devolucion"
            self.grid1.SetReadOnly(fil, 0, False)
            self.grid1.SetReadOnly(fil, 2, False)
            self.grid1.SetReadOnly(fil, 3, False)
            self.grid1.SetReadOnly(fil, 4, True)
            return
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        if nosuma:
            self.grid1.SetCellValue(fil, 0, articulo['codartprov']+"+") #cod. prov
        else:
            self.grid1.SetCellValue(fil, 0, articulo['codartprov']) #cod. prov
        self.grid1.SetCellValue(fil, 1, articulo['codsussan']) #cod. sussan
        self.grid1.SetCellValue(fil, 2, articulo['descri']) #descri
        self.grid1.SetCellValue(fil, 3, "1") #cant.
        self.grid1.SetCellValue(fil, 4, str(articulo['preciocompra'])) #p compra
        self.grid1.SetCellValue(fil, 7, str(articulo['preciolt2'])) #final
        self.grid1.SetCellValue(fil, 8, str(articulo['preciolt1'])) #precio venta
        self.grid1.SetReadOnly(fil, 1, True)
        self.grid1.SetReadOnly(fil, 2, True)
        self.grid1.SetReadOnly(fil, 4, True)
        self.grid1.SetReadOnly(fil, 5, True)
        self.grid1.SetReadOnly(fil, 6, True)
        self.grid1.SetReadOnly(fil, 7, True)
        self.grid1.SetReadOnly(fil, 8, True)
        self.grid1.SetCellAlignment(fil, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellAlignment(fil, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellAlignment(fil, 5, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellAlignment(fil, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellAlignment(fil, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.SetCellAlignment(fil, 8, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
        self.grid1.AppendRows()

    def OnGrid1GridCellChange(self, event):
        '''Manejador de los cambios en la grilla'''
        fila = self.grid1.GetGridCursorRow()
        columna = self.grid1.GetGridCursorCol()
        celda = self.grid1.GetCellValue(fila, columna)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,None)

        #CELDA VACIA
        if celda == "" :
            self.grid1.SetCellValue(fila, columna, "")
            for x in xrange(self.grid1.GetNumberCols()):
                self.grid1.SetCellValue(fila, x, "")
                self.grid1.SetReadOnly(fila,x,False)

            self.actualizaSubtotal()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila,True)
            self.autosizegrilla()
            self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                  self.OnGrid1GridCellChange)
            return

        #PRODUCTO DE DEVOLUCION: TIENE * EN EL CODIGO
        if '*' in self.grid1.GetCellValue(fila,0):
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            if columna == 0:
                codartprov = self.grid1.GetCellValue(fila, columna)
                codartprov = codartprov.replace("*","")
                resultados = self._buscar(codartprov,fila)
                if len(resultados) != 0:
                    resultados = self._buscar(codartprov,fila)
                    articulo = resultados[0]
                    self.grid1.SetCellValue(fila, 2, articulo['descri']) #descri
                    self.grid1.SetCellValue(fila, 4, str(articulo['preciocompra'])) #descri

            self.grid1.SetCellValue(fila,1,"DEV")
            self.grid1.SetReadOnly(fila,1)
            #self.grid1.SetReadOnly(fila,4) #ingresa precio
            self.grid1.SetReadOnly(fila,5)
            self.grid1.SetReadOnly(fila,6)
            self.grid1.SetReadOnly(fila,7)
            self.grid1.SetReadOnly(fila,8)
            self.grid1.SetCellAlignment(fila, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 5, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 8, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.AppendRows()
            self.actualizaSubtotal()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)
            self.autosizegrilla()
            self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                  self.OnGrid1GridCellChange)
            return

        #AJUSTE POR REDONDEO FACTURA
        if self.grid1.GetCellValue(fila,0) == "ajuste":
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            self.grid1.SetCellValue(fila,1,"AJUSTE")
            self.grid1.SetCellValue(fila,2,"x redondeo")
            self.grid1.SetReadOnly(fila,1)
            self.grid1.SetReadOnly(fila,2)
            self.grid1.SetReadOnly(fila,3)
            self.grid1.SetReadOnly(fila,4) #valor unitario
            self.grid1.SetReadOnly(fila,5)
            self.grid1.SetReadOnly(fila,6)
            self.grid1.SetReadOnly(fila,8)
            total = self.grid1.GetCellValue(fila,7)
            try:
                total = Decimal(total)
                if abs(total)>Decimal("10.00"):
                    utiles.mensaje(None,"El ajuste no puede ser mayor a $10")
                    self.grid1.SetCellValue(fila,3,"")
                    self.grid1.SetCellValue(fila,4,"")
                    self.grid1.SetCellValue(fila,5,"")
                    self.grid1.SetCellValue(fila,6,"")
                    self.grid1.SetCellValue(fila,7,"0.00")
                    self.autosizegrilla()
                    self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                          self.OnGrid1GridCellChange)
                    return
            except:
                self.autosizegrilla()
                self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                      self.OnGrid1GridCellChange)
                return
            # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
            tipoDoc = str(self.comboBox2.GetSelection())
            if tipoDoc in ["0","2","4","5"]:
                try:
                    sinIVA = (total/Decimal("1.21")).quantize(Decimal("0.10"))
                except:
                    sinIVA = Decimal("0.00")
            else:
                sinIVA = total
            iva = total-sinIVA
            #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
            #0            1          2      3    4       5        6   7     8
            self.grid1.SetCellValue(fila,3,"1")
            self.grid1.SetCellValue(fila,4,str(sinIVA))
            self.grid1.SetCellValue(fila,6,str(iva))
            self.grid1.SetCellValue(fila,7,str(total))
            self.grid1.SetCellAlignment(fila, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 5, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fila, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.AppendRows()
            self.actualizaSubtotal()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)
            self.autosizegrilla()
            self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                  self.OnGrid1GridCellChange)
            return
        
        #INGRESO ALGO
        # BUSCAR
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        if ( columna == 0 and celda.startswith("?") ):
            codsussan, codartprov = self._buscar_interactivo()
            nosuma = False
            if "+" in codartprov:
                nosuma = True
            codartprov = codartprov.replace("+","")
            if not codsussan:
                codsussan = self._alta_interactivo()
                resultados = self._buscar(codsussan,fila)
            else:
                resultados = self._buscar(codartprov,fila)
            
            try:
                articulo = resultados[0]
            except:
                utiles.mensaje(None,"Producto no ingresado")
                self.grid1.SetFocus()
            self._mostrar_articulo_en_grilla(fila, articulo, nosuma)

            #actualizo subtotal
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)

        # INGRESO UN CODIGO
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        elif (columna == 0):
            codartprov = self.grid1.GetCellValue(fila, columna)
            if "*" in codartprov:
                #devolucion
                self.autosizegrilla()
                self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
                      self.OnGrid1GridCellChange)
                return
            nosuma = False
            if "+" in codartprov:
                nosuma = True
            codartprov = codartprov.replace("+","")
            resultados = self._buscar(codartprov,fila)
            # NO LO ENCONTRO.
            if len(resultados) == 0:
                codsussan, codartprov_old = self._buscar_interactivo()
                if codsussan:
                    self._asociar_codsussan_codbarra(codartprov, codsussan)
                else:
                    #NO LO ENCONTRO. DAR DE ALTA. OK
                    self._alta_interactivo(codartprov)
                    
            resultados = self._buscar(codartprov,fila)
            
            try:
                articulo = resultados[0]
                self._mostrar_articulo_en_grilla(fila, articulo, nosuma)
            except:
                for i in xrange(self.grid1.GetNumberCols()):
                    self.grid1.SetCellValue(fila,i,"")
            
            #actualizo subtotal
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)
            
        #INGRESO UNA CANTIDAD
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        elif (columna == 3):
            #validar que sea un nro. en la cantidad
            self._validar_cantidad(fila)
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)
    
        #INGRESO UN PRECIO
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        elif (columna == 4):
            #validar que sea un nro. en la cantidad
            if not self._validar_precio(fila):
                self.grid1.SetCellValue(fila, 4, "1.00")
                self.grid1.SetCellAlignment(fila, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
                
            self.actualizaSubtotal()
            #self.autosizegrilla()
            self.grid1.Refresh()
            self.almacenamientoTemporal(fila)

        self.autosizegrilla()
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,
              self.OnGrid1GridCellChange)

    def _validar_precio(self, fila):
        '''Verifica que el precio este correcto'''
        precio = self.grid1.GetCellValue(fila, 4)
        if not utiles.isDecimal(precio):
            msg   = "El Costo Unitario debe ser un numero"                         
            utiles.mensaje(self, msg)
            return False
        return True
            
    def _validar_cantidad(self, fila):
        '''Verifica que la cantidad en una fila sea adecuada'''
        error = False
        msg   = ""
        cantidad = self.grid1.GetCellValue(fila, 3)
        try:
            if int(cantidad) == 0:
                error = True
                msg = "La cantidad no puede ser CERO"
                self.grid1.SetCellValue(fila, 3, "1")
                self.grid1.SetCellAlignment(fila, 3 ,wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
                
        except:
            error = True
            msg   = "La cantidad debe ser un numero entero"             
            self.grid1.SetCellValue(fila, 3, "1")
            self.grid1.SetCellAlignment(fila, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)

        if error:
            mensaje = wx.MessageDialog(self, msg, "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()
            return False
        
        return True     
            
    def actualizaSubtotal(self):        
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        cantidades = 0
        tomocelda  = 0.0
        # validar solo cuando se ingresa un nro y no una letra
        for x in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(x),0) == ""):
                continue
            try:
                cantidad = int(self.grid1.GetCellValue(int(x),3))
            except:
                cantidad = 0
            cantidades += cantidad
            try:
                precio = Decimal(self.grid1.GetCellValue(x, 4)).quantize(Decimal("0.10"))
            except:
                precio = Decimal("0.00")
            subtotal = (cantidad*precio).quantize(Decimal("0.10"))
            self.grid1.SetCellValue(x,5,str(subtotal))
            self.grid1.SetCellAlignment(x, 5, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            iva = Decimal("0.00")
            #if self.radioButton1.GetValue():
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
            tipoDoc = str(self.comboBox2.GetSelection())
            if tipoDoc in ["0","2","4","5"]:
                try:
                    iva = (precio*Decimal("0.21")).quantize(Decimal("0.10"))
                except:
                    iva = Decimal("0.00")
            else:
                iva = Decimal("0.00")
            try:
                total = Decimal(str(cantidad*(precio+iva))).quantize(Decimal("0.10"))
            except:
                total = Decimal("0.00")
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            self.grid1.SetCellValue(x, 6, str(iva))
            self.grid1.SetCellAlignment(x, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellValue(x, 7, str(total))
            self.grid1.SetCellAlignment(x, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.Refresh() # va un refresh asi el proximo metodo ya toma los cambios

        self.incantidades.ChangeValue(str(cantidades))  
        self.subtotalfactura()

    def subtotalfactura(self):
        '''Calcula y muestra en pantalla el subtotal de la factura'''
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        subtotal = Decimal("0.00")
        for fila in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fila,0)=="":
                continue
            if "+" in self.grid1.GetCellValue(fila,0):
                continue
            try:
                monto = Decimal(self.grid1.GetCellValue(fila,7)).quantize(Decimal("0.10"))
            except:
                monto = Decimal("0.00")
            subtotal = (subtotal+monto).quantize(Decimal("0.10"))
        #if self.radioButton1.GetValue():
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        tipoDoc = str(self.comboBox2.GetSelection())
        if tipoDoc in ["0","2","4","5"]:
            siniva = (subtotal/Decimal("1.21")).quantize(Decimal("0.10"))
            iva = (siniva*Decimal("0.21")).quantize(Decimal("0.10"))
        else:
            siniva = subtotal
            iva = Decimal("0.00")
        
        self.insubtotal.SetLabel(str(siniva))
        self.textCtrl9.SetLabel(str(siniva))
        self.iniva.SetLabel(str(iva))
        self.intotal.SetLabel(str(subtotal))

        self.OnDescuentoPerderFoco(None)
        self.grid1.Refresh()

    def _cantidad_de_prendas(self):
        '''Retorna la cantidad de prendas en la grilla'''
        return self.incantidades.Value
            
    def _crear_factura(self):
        '''Crea una factura de compra en la BD'''
        idfactura = utiles.secuencia("compras", self.sucursal)
        nrofactura = self.nro_factura.Value
        idproveedor = self.inproveedor.Value
        fechafactura = utiles.formatear_fecha_date(self.infechafactura.Value)
        fechaingreso = utiles.obtenerFecha("Y-m-d h:m:s")
        cantprendas = self._cantidad_de_prendas()
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 
        # Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        tipoDoc = str(self.comboBox2.GetSelection())
        if tipoDoc in ["0","1","2","7","8"]:
        #if self.radioButton1.GetValue():
            en1oen2 = 1
        elif tipoDoc in ["3","6","9","10"]:
            en1oen2 = 2
        else:
            self.checkBox1.SetValue(True)
            return
        subtotal = self.insubtotal.Value   
        iva = self.iniva.Value
        total = self.intotal.Value
        totaltotal = self.totaltotal.Value
        porIVA = self.choice1.GetLabel()
        miObservacion = self.textCtrl3.GetLabel()
        descSinIVA = self.textCtrl7.GetLabel()
        descConIVA = self.indesc.GetLabel()
        
        r1 = "INSERT INTO compras ( \n"
        r2 = "idfactura, tipodoc,nrofactura, idproveedor, \n"
        r3 = "fechafactura, fechaingreso, cantprendas, \n"
        r4 = "en1oen2, subtotal, iva, total, porIVA, observaciones, \n"
        r5 = "descSinIVA, descConIVA) \n"
        r6 = "VALUES ('%s', \n" % (idfactura)
        r7 = "'%s','%s','%s', \n" % (tipoDoc, nrofactura, idproveedor)
        r8 = "'%s','%s','%s', \n" % (fechafactura, fechaingreso, cantprendas)
        r9 = "'%s','%s','%s', \n" % (en1oen2, subtotal, iva)
        r0 = "'%s','%s','%s', \n" % (totaltotal, porIVA, miObservacion)
        rA = "'%s','%s') " % (descSinIVA, descConIVA)
        sql = r1+r2+r3+r4+r5+r6+r7+r8+r9+r0+rA
        consultasBD.executaSinCommit(None, sql)
        return idfactura
        
    def _agregar_items(self, idfactura):
        '''Agrega items a la factura creada'''

        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 
        # Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        tipoDoc = str(self.comboBox2.GetSelection())
        if tipoDoc in ["4","5"]:
            self.checkBox1.SetValue(True)
            return

        for x in xrange(self.grid1.GetNumberRows()):
            if (self.grid1.GetCellValue(int(x),0) == ""):
                continue
            if (self.grid1.GetCellValue(int(x),0) == "ajuste"):
                color = "AJU"
                talle = "AJU"
            elif "*" in self.grid1.GetCellValue(int(x),0):
                color = self.grid1.GetCellValue(int(x),2)
                talle = self.grid1.GetCellValue(int(x),0)
            else:
                color = "zZz"
                talle = "ZzZ"
            
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            codsussan = self.grid1.GetCellValue(int(x),1)
            cantidad = int(self.grid1.GetCellValue(int(x),3))
            costounidad = str(Decimal(self.grid1.GetCellValue(x,4)).quantize(Decimal("0.10")))

            r1 = "INSERT INTO compras_items (idfactura, codsussan, color, talle, cantidad, costounidad) "
            r2 = "VALUES ("
            r3 = "'%s', '%s', '%s'," % (idfactura, codsussan, color)
            r4 = "'%s', '%s', '%s')" % (talle, cantidad, costounidad)
            sql = r1+r2+r3+r4
            consultasBD.executaSinCommit(None, sql)

    def _validar_guardar(self):
        '''Validaciones varias antes de guardar una factura'''
        error = False
        msg = ""

        try:
            valorfacturacargado = Decimal(self.textCtrl2.GetLabel()).quantize(Decimal("0.10"))
            valorfacturacalcula = Decimal(self.totaltotal.GetLabel()).quantize(Decimal("0.10")) 
        except:
            valorfacturacargado = 0
            valorfacturacalcula = 0
            error = True
            msg+= "Error en valor factura y/o calculado\n"
        
        if valorfacturacargado<>valorfacturacalcula:
            diferencia = abs(valorfacturacargado-valorfacturacalcula)
            if diferencia>Decimal("0.15"):
                error = True
                msg += "Total cargado no coincide con calculado\n"
                #self.textCtrl2.Enable(True)
                #self.textCtrl2.SetFocus()

        if self.inNombreProvee.Value == "":
            error = True
            msg += "Ingrese un Proveedor\n"
            
        if self.nro_factura.Value == "":    
            error = True
            msg += "Ingrese el Numero de Factura\n"
                
        if self.incantidades.Value in ("", "0"):
            error = True
            msg += "Debe ingresar por lo menos un Articulo"
                
##        if self.radioButton1.GetValue()==False and self.radioButton2.GetValue()==False:
##            error = True
##            msg += "Debe indicar si Actualiza o No el servidor\n(tipo 1 o 2)"
                
        if error:
            mensaje = wx.MessageDialog(self, msg, "Error", style=wx.OK,pos = wx.DefaultPosition)
            mensaje.ShowModal()
            return  False
            
        return True 
 
    def OnGuardar(self, event):
        self.autosizegrilla()
        if not self._validar_guardar():
            print "No validado el guardado, faltan datos"
            return
        self.observaciones = ""
        self.button2.Enable(False)
        self.button2.SetLabel('PROCESANDO')
        proveedor = self.inNombreProvee.GetLabel()+" / "+self.inproveedor.GetLabel()
        #quito simbolo para no sumar en total
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        for fil in xrange(self.grid1.GetNumberRows()):
            aux = self.grid1.GetCellValue(fil,0)
            aux.replace("+","")
            self.grid1.SetCellValue(fil,0,aux)

        import ComprasDevolucionObservaciones

        for fil in xrange(self.grid1.GetNumberRows()):
            if "*" in self.grid1.GetCellValue(fil,0):
                observaciones = ComprasDevolucionObservaciones.Dialog1(None, proveedor)
                try:
                    observaciones.ShowModal()
                    self.observaciones = observaciones.getObservacion()
                finally:
                    observaciones.Destroy()
                break

        try:
            consultasBD.begin()

            idfactura = self._crear_factura()
            self._agregar_items(idfactura)
            self.guardaencomprasoperaciones(idfactura)

            consultasBD.commit()
            sincronizar_tabla.syncServerTables(self, ["productos", "producto_talle_color", "stock"])
            #raise sincronizar_tabla.SyncError
            utiles.mensaje(self, "La compra se guardo y sincronizo correctamente")
 
        except sincronizar_tabla.SyncError:
            texto = "La compra se guardo.\nRealice una sincronizacion manual\n"
            utiles.mensaje(self, texto)
        except Exception, e:
            import traceback
            import sys
            exc_type, exc_value, exc_tb = sys.exc_info()
            traceback.print_exception(exc_type, exc_value, exc_tb)
            print e.__str__()
            consultasBD.rollback()
            utiles.mensaje(self, "NO se pudo guardar la compra")    
            self.button2.SetLabel('GUARDAR')
            self.button2.Enable(True)
            return

        try:
            #procesa DEVOLUCIONES
            consultasBD.begin()
            self.procesarDevoluciones()
            consultasBD.commit()
        except:
            import traceback
            import sys
            exc_type, exc_value, exc_tb = sys.exc_info()
            traceback.print_exception(exc_type, exc_value, exc_tb)
            print e.__str__()
            consultasBD.rollback()
            texto = "NO se pudieron procesar las devoluciones\n"
            texto+= "Modifique el saldo como Ajuste, proceda\n"
            texto+= "a realizar una Devolucion manual (en papel)"
            utiles.mensaje(self, texto)    
        
        self.OnAceptar(None,False)
        self.button2.SetLabel('GUARDAR')
        self.button2.Enable(True)

    def guardaencomprasoperaciones(self,idfactura):
        idproveedor = self.inproveedor.GetValue()
        nrofactura = self.nro_factura.GetValue()
        cantprendas = self._cantidad_de_prendas()
        total = self.totaltotal.Value
        interno = "0" # no es movimiento interno
        if self.checkBox1.GetValue():
            interno = "1" #es movimiento interno
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 
        # Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        tipoDoc = str(self.comboBox2.GetSelection())
        if tipoDoc in ["0","1","2","4","5"]:
        #if self.radioButton1.GetValue():
            en1oen2 = 1
        else:
            en1oen2 = 2
        total1 = 0
        total2 = 0
        
        if tipoDoc in ["0","1","2","4","5"]:
        #if self.radioButton1.GetValue():
            total1 = total
            total2 = 0.00
            en1oen2 = 1
        else:
            total1 = 0.00
            total2 = total
            en1oen2 = 2
 
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        if tipoDoc in ["0","1","2","3","6"]:
            tipoOperacion = "COMPRA"
        elif tipoDoc in ["4"]:
            tipoOperacion = "NTA.CREDITO"
        elif tipoDoc in ["5"]:
            tipoOperacion = "NTA.DEBITO"
        elif tipoDoc in ["7"]:
            tipoOperacion = "CREDITO 2"
            tipoDoc = "10"
        else:
            tipoOperacion = "PAGO"
        subtotal = self.insubtotal.Value
        iva = self.iniva.Value
        
        fecha = utiles.obtenerFecha("Y-m-d h:m:s")
        #saca el nro de registro
        #sql2 = "SELECT idregistro FROM proveedor WHERE idproveedor='%s'" % str(idproveedor)
        #resultado = consultasBD.ordenCrudaResultDict(sql2)
        #self.registro = int(resultado["idregistro"])+1
        temporada = self.comboBox1.GetLabel()
        miObservaciones = self.textCtrl3.GetLabel()
        
        r1 = "INSERT INTO comprasaldos ("
        r2 = "idoperacion,fecha,idproveedor,"
        r3 = "monto1,monto2,tipodoc, "
        r4 = "nrofactura,cantproductos,idforma1o2, "
        r5 = "observaciones,operador,temporada, "
        r6 = "interno) "
        r7 = "VALUES ("
        r8 = "'%s', '%s', '%s', " % (tipoOperacion, fecha, idproveedor)
        r9 = "'%s', '%s', '%s', " % (total1, total2, tipoDoc)
        r0 = "'%s', '%s', '%s', " % (nrofactura, cantprendas, en1oen2)
        rA = "'%s', '%s', '%s', " % (miObservaciones, "", temporada)
        rB = "'%s')" % (interno)
        sql = r1+r2+r3+r4+r5+r6+r7+r8+r9+r0+rA+rB
        resultado = consultasBD.executaSinCommit(None, sql)
        
        #sqlupdate = "UPDATE proveedor SET idregistro=idregistro+1 WHERE idproveedor='%s'" % (idproveedor)
        #resultado = consultasBD.executaSinCommit(None,sqlupdate)

    def OnBuscarProveedorButton(self, event):
        if self.inproveedor.GetValue() != "":
            r1 = "SELECT idproveedor,nombre "
            r2 = "FROM proveedor WHERE idproveedor = '"+self.inproveedor.GetValue()+"' "
            consultaSQL = r1+r2
            resultado = consultasBD.ordenCrudaDict(consultaSQL)
            if resultado != ():
                proveedor = resultado[0]
                self.inproveedor.SetLabel(proveedor["idproveedor"])
                self.inNombreProvee.SetLabel(proveedor["nombre"])
                self.comboBox2.SetFocus()
                return
            self.inproveedor.SetLabel("")
            self.inproveedor.SetFocus()
            return
        if self.inNombreProvee.GetValue() != "":
            consultaSQL = "SELECT idproveedor,nombre FROM proveedor WHERE nombre LIKE '%"+self.inNombreProvee.GetValue()+"%' "
            resultado = consultasBD.ordenCrudaDict(consultaSQL)
            if resultado != () and len(resultado)==1:
                proveedor = resultado[0]
                self.inproveedor.SetLabel(proveedor["idproveedor"])
                self.inNombreProvee.SetLabel(proveedor["nombre"])
                self.comboBox2.SetFocus()
                return
        import BuscaProveedor2
        ventana = BuscaProveedor2.Dialog1(self,self.inNombreProvee.GetLabel())
        try:
            ventana.ShowModal()
            eleccion = ventana.getSeleccion()
        finally:
            ventana.Destroy()
        if eleccion.split(" / ") != ['']:
            self.inproveedor.SetValue(eleccion.split(" / ")[1])
            self.inNombreProvee.SetValue(eleccion.split(" / ")[0])
        self.comboBox2.SetFocus()

    def OnDescuentoPerderFoco(self, event):
        try:
            subtotal = Decimal(self.intotal.GetLabel()).quantize(Decimal("0.10"))
        except:
            subtotal = Decimal("0.00")
        try:
            descuento = Decimal(self.indesc.GetLabel()).quantize(Decimal("0.10"))
        except:
            descuento = Decimal("0.00")
        subdescuento = (subtotal*descuento/Decimal("100.00")).quantize(Decimal("0.10"))
        self.textCtrl6.SetLabel(str(subdescuento))
        total = subtotal - subdescuento
        self.indesc.SetLabel(str(descuento))
        self.totaltotal.SetLabel(str(total))

    def OnRadioBox1Radiobox(self, event):
        suma=0.0
        if self.radioBox1.Selection==0:
            suma = float(self.intotal.Value)+float(self.iniva.Value)
            print suma
            self.totaltotal.ChangeValue(str(suma))
        else:
            self.totaltotal.ChangeValue(self.intotal.Value)
        self.OnDescuentoPerderFoco(None)

    def almacenamientoTemporal(self,fila,borrar=False):
        f=open("Compras2.txt","a")
        nroproveedor = self.inproveedor.GetLabel()
        proveedor = self.inNombreProvee.GetLabel()
        # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
        tipoDoc = str(self.comboBox2.GetSelection())
        nrofactura = self.nro_factura.GetLabel()
        totalfactura = self.textCtrl2.GetLabel()
        fechafactura = self.infechafactura.GetLabel()
        fechaingreso = self.textCtrl1.GetLabel()
        temporada = self.comboBox1.GetLabel()
        cantidades = self.incantidades.GetLabel()
        siniva = self.insubtotal.GetLabel()
        iva = self.iniva.GetLabel()
        subtotal = self.intotal.GetLabel()
        descuento = self.indesc.GetLabel()
        total = self.totaltotal.GetLabel()
        encabezado = nroproveedor+"[;]"+proveedor+"[;]"+tipoDoc+"[;]"+nrofactura+"[;]"
        encabezado+= totalfactura+"[;]"+fechafactura+"[;]"+fechaingreso+"[;]"
        encabezado+= temporada+"[;]"+cantidades+"[;]"+siniva+"[;]"+iva+"[;]"
        encabezado+= subtotal+"[;]"+descuento+"[;]"+total+"[;]"
        if not borrar:
            cadena = str(fila)+"[;]"+encabezado
            for item in xrange(self.grid1.GetNumberCols()):
                cadena+= str(self.grid1.GetCellValue(fila,item))+"[;]"
        else:
            cadena = "-1[;]"+str(fila)+"[;]"+encabezado
        cadena = cadena[:-3]+"\n"
        f.write(cadena)
        f.close()

    def verificarInterrupcion(self):
        if not os.path.isfile("Compras2.txt"):
            f=open("Compras2.txt","w")
            f.close()
            print "Almacenamiento de Compras iniciado"
            return
        #existe archivo, por lo tanto un corte interrumpio la carga y se debe recuperar la informacion
        f=open("Compras2.txt","r")
        lista = f.readlines()
        f.close()
        if len(lista)==0:
            f=open("Compras2.txt","w")
            f.close()
            print "Almacenamiento de Compras iniciado"
            return
        self.habilitaEncabezado(False)
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,None)
        print "Restaurando ultima Compra"
        for item in lista:
            cadena = item.split("[;]")
            if cadena[0]=="-1":
                self.grid1.DeleteRows(int(cadena[1]))
                continue
            try:
                fil = int(cadena[0])
            except:
                continue
            self.inproveedor.SetLabel(cadena[1])
            self.inNombreProvee.SetLabel(cadena[2])
            self.comboBox2.SetSelection(int(cadena[3]))
            self.nro_factura.SetLabel(cadena[4])
            self.textCtrl2.SetLabel(cadena[5])
            self.infechafactura.SetLabel(cadena[6])
            self.textCtrl1.SetLabel(cadena[7])
            self.comboBox1.SetLabel(cadena[8])
            self.incantidades.SetLabel(cadena[9])
            self.textCtrl9.SetLabel(cadena[10])
            self.insubtotal.SetLabel(cadena[10])
            self.iniva.SetLabel(cadena[11])
            self.intotal.SetLabel(cadena[12])
            self.indesc.SetLabel(cadena[13])
            self.totaltotal.SetLabel(cadena[14])

            #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnitario,Subtotal,Iva,Total,PVenta
            #15           16         17     18   19          20       21  22    23   
            #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
            #0            1          2      3    4       5        6   7     8
            aux = cadena[15]
            self.grid1.SetCellValue(fil,0,cadena[15])
            self.grid1.SetCellValue(fil,1,cadena[16])
            self.grid1.SetCellValue(fil,2,cadena[17])
            self.grid1.SetCellValue(fil,3,cadena[18])
            self.grid1.SetCellValue(fil,4,cadena[19])
            self.grid1.SetCellValue(fil,5,cadena[20])
            self.grid1.SetCellValue(fil,6,cadena[21])
            self.grid1.SetCellValue(fil,7,cadena[22])
            self.grid1.SetCellValue(fil,8,cadena[23])
            self.grid1.SetReadOnly(fil, 1, True)
            self.grid1.SetReadOnly(fil, 2, True)
            self.grid1.SetReadOnly(fil, 4, True)
            self.grid1.SetReadOnly(fil, 5, True)
            self.grid1.SetReadOnly(fil, 6, True)
            self.grid1.SetReadOnly(fil, 7, True)
            if "*" in self.grid1.GetCellValue(fil,0):
                self.grid1.SetReadOnly(fil,2,False)
            if aux == "ajuste":
                self.grid1.SetReadOnly(fil,3,True)
                self.grid1.SetReadOnly(fil,4,False)
                self.grid1.SetReadOnly(fil,7,False)
            self.grid1.SetCellAlignment(fil, 3, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 4, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 5, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 6, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 7, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            self.grid1.SetCellAlignment(fil, 8, wx.ALIGN_RIGHT, wx.ALIGN_CENTRE)
            if fil<(self.grid1.GetNumberRows()-1):
                continue
            self.grid1.AppendRows()

        self.autosizegrilla()
        self.grid1.Bind(wx.grid.EVT_GRID_CELL_CHANGE,self.OnGrid1GridCellChange)

    def OnRadio1(self, event):
        self.recalculaIVA()

    def OnRadio2(self, event):
        self.recalculaIVA()
        
    def recalculaIVA(self):
        for fil in xrange(self.grid1.GetNumberRows()):
            if self.grid1.GetCellValue(fil,0)=="":
                continue
            #Cod Art Prov,Cod Sussan,Descri,Cant,$ Costo,Iva,Total,Precio Venta
            #14           15         16     17   18      19  20    21
            #0            1          2      3    4       5   6     7
            #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
            #0            1          2      3    4       5        6   7     8
            porIVA = Decimal("0.21")
            try:
                cantidad = Decimal(self.grid1.GetCellValue(fil,3)).quantize(Decimal("0.10"))
            except:
                cantidad = Decimal("0.00")
            try:
                costo = Decimal(self.grid1.GetCellValue(fil,4)).quantize(Decimal("0.10"))
            except:
                costo = Decimal("0.00")
            subtotal = (cantidad*costo).quantize(Decimal("0.10"))
            iva = Decimal("0.00")
            # FactA 0 - FactC 1 - Rto1 2 - Rto2 3 - NtaCredito 4 - NtaDebito 5 - Otros2 6 - Otros1 7 - Pag1 8 - Pag2 9 - Credito2 10
            tipoDoc = str(self.comboBox2.GetSelection())
            if tipoDoc in ["0","2","4","5"]:
                iva = (costo*porIVA).quantize(Decimal("0.10"))
            total = ((costo+iva)*cantidad).quantize(Decimal("0.10"))
            self.grid1.SetCellValue(fil,5,str(subtotal))
            self.grid1.SetCellValue(fil,6,str(iva))
            self.grid1.SetCellValue(fil,7,str(total))
            self.almacenamientoTemporal(fil)
        self.actualizaSubtotal()

    def procesarDevoluciones(self):
        lista = []
        for fila in xrange(self.grid1.GetNumberRows()):
            if not "*" in self.grid1.GetCellValue(fila,0):
                continue
            lista.append(fila)

        if lista == []:
            print "No hay devoluciones"
            return

        listaFila = lista
        #grabando en devoluciones

        obs = self.observaciones

        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
        #encabezado en comprasdevoluciones
        sucursal = utiles.getSucursalActiva()
        idDevolucion =  utiles.secuencia("compras_devolucion", sucursal)
        idProveedor = self.inproveedor.GetLabel()
        fecha = utiles.obtenerFecha("Y-m-d h:m:s")
        cant = 0
        total = Decimal("0.00")
        for fil in listaFila:
            cant+= int(self.grid1.GetCellValue(fil,3))
            total+= Decimal(self.grid1.GetCellValue(fil,7))
        cantProductos = str(cant)
        montoDevolucion = str(total)
        causaDevolucion = obs

        r1 = "INSERT INTO comprasdevoluciones(idDevolucion,idProveedor,fecha,"
        r2 = "            cantProductos,montoDevolucion,causaDevolucion,auditoria) "
        r3 = "VALUES('%s','%s','%s'," % (idDevolucion,idProveedor,fecha)
        r4 = "'%s','%s','%s', " % (cantProductos,montoDevolucion,causaDevolucion)
        r5 = "'%s')" % (fecha)
        sql = r1+r2+r3+r4+r5
        consultasBD.executaSinCommit(None, sql)

        #detalle item devoluciones en comprasdevoluciones-items
        for fil in listaFila:
            #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
            #0            1          2      3    4       5        6   7     8
            #en vez de PTC o CODSUSSAN, se guarda el COD ART PROVEEDOR
            ptc = self.grid1.GetCellValue(fil,0)
            codartproveedor = self.grid1.GetCellValue(fil,0)
            talle = ""
            color = "0"
            cantidad = self.grid1.GetCellValue(fil,3)
            monto = self.grid1.GetCellValue(fil,7)
            
            r1 = "INSERT INTO comprasdevoluciones_items(idDevolucion,"
            r2 = "idProveedor,fecha,ptc,codsussan,talle,color,cantidad,monto,"
            r3 = "otro) VALUES("
            r4 = "'%s','%s','%s','%s'," % (idDevolucion,idProveedor,fecha,ptc)
            r5 = "'%s','%s','%s','%s'," % (codartproveedor,talle,color,cantidad)
            r6 = "'%s','%s')" % (monto,"")
            sql = r1+r2+r3+r4+r5+r6
            consultasBD.executaSinCommit(None, sql)
            
        self.imprimirDevoluciones(lista,idDevolucion)

    def imprimirDevoluciones(self,listaFilas,idDevolucion):
        print "Imprimir Devoluciones"
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8

        f=open("c:\\erpsussan.doc\\reporte-devoluciones.html","w")
        numeroPagina = 1
        nrosuc,nombresuc = utiles.datosSucursal()
        
        totalItemPorPagina = 50-6 #resto 6 estimando renglones de encabezado
        totalPaginas = len(listaFilas) / totalItemPorPagina 
        totalPaginas+= 1

        def encabezadoPagina(texto):
            fecha = utiles.obtenerFecha("d-m-Y")

            a = '<table width="100%" cellspacing="0" border="1"> \n'
            a+= '<tr><td> \n'
            a+= '<table width="100%" cellspacing="0" border="0"> \n'
            a+= '<tr> \n'
            a+= '<td valign="top" align="left" width="33%"> \n'
            a+= '<strong>SUSSAN S.R.L.<br> \n'
            a+= '<font size="1">General L&oacute;pez 3110 esq. Urquiza<br> \n'
            a+= 'cuit: 30-71105924-1<br> \n'
            a+= 'SANTA FE - cp: S3000DCR</font></strong> \n'
            a+= '</td> \n'
            a+= '<td valign="top" align="right" width="33%">'+fecha+' \n'
            a+= '<br>P&aacute;gina '+str(numeroPagina)+' / '+str(totalPaginas)+'</td> \n'
            a+= '</tr> \n'
            a+= '</table> \n'
            a+= '</td></tr> \n'
            a+= '</table><br><div align="right"> \n'
            a+= 'DEVOLUCION '+str(idDevolucion)+'</div><div align="left"><br> \n'
            a+= 'Proveedor: <strong>'+self.inNombreProvee.GetLabel()+"</strong> / "+self.inproveedor.GetLabel()+'<br> \n'
            a+= 'Tipo Documento: <i>'+self.comboBox2.GetLabel()+'</i> NRO <i>'+self.nro_factura.GetLabel()+'</i><br> \n '
            a+= 'Fecha: '+self.infechafactura.GetLabel()+' Fecha Ingreso: '+self.textCtrl1.GetLabel()+'<br> \n'
            if self.observaciones!="":
                a+= '<br>Motivo de la devoluci&oacute;n: '+self.observaciones
            a+= '</div><br> \n'
            texto+= a
            return texto
        
        def encabezadoTabla(texto):
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            #a = '<hr>'
            a = ''

            a+= '<table width="100%" cellspacing="0" border="1"> \n'
            a+= '<tr> \n'
            a+= '<td valign="top" align="right"></td> \n'
            a+= '<td valign="top" align="right">C&oacute;digo<br>Proveedor</td> \n'
            a+= '<td valign="top" align="left">C&oacute;d.<br>Sussan</td> \n'
            a+= '<td valign="top" align="left">Descripci&oacute;n</td> \n'
            a+= '<td valign="top" align="right">Cant</td> \n'
            a+= '<td valign="top" align="right">Costo<br>Unidad</td> \n'
            a+= '<td valign="top" align="right">Subtotal</td> \n'
            tipoDoc = str(self.comboBox2.GetSelection())
            if tipoDoc in ["0","2","4","5"]:
                a+= '<td valign="top" align="right">IVA</td> \n'
                a+= '<td valign="top" align="right">TOTAL</td> \n'
            a+= '</tr> \n'
            a+= '<tr> \n'
            if tipoDoc in ["0","1","2","4","5"]:
                #a+= '<td colspan="9"><hr></td> \n'
                a+= '<td colspan="9"></td> \n'
            else:
                #a+= '<td colspan="8"><hr></td> \n'
                a+= '<td colspan="7"></td> \n'
            a+= '</tr> \n'
            texto+= a
            return texto

        def piePagina(totalProductos,totalSubtotal,totalIVA,totalTotal):
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            a = '<table width="100%" cellspacing="0" border="1"> \n'
            a+= '<tr><td> \n'
            a+= '<table width="100%" cellspacing="0" border="0"> \n'
            a+= '<tr> \n'
            a+= '<td valign="top" align="left" width="33%"> \n'
            a = '<tr> \n'
            a+= '<td valign="top" align="right"></td> \n' #orden
            a+= '<td valign="top" align="left"></td> \n' #codartprov
            a+= '<td valign="top" align="left"></td> \n' #codsussan
            a+= '<td valign="top" align="right">TOTALES</td> \n' #descripcion
            a+= '<td valign="top" align="right">'+str(totalProductos)+'</td> \n'
            a+= '<td valign="top" align="right"></td> \n'
            a+= '<td valign="top" align="right">'+str(totalSubtotal)+'</td> \n'
            tipoDoc = str(self.comboBox2.GetSelection())
            if tipoDoc in ["0","2","4","5"]:
                a+= '<td valign="top" align="right">'+str(totalIVA)+'</td> \n'
                a+= '<td valign="top" align="right">'+str(totalTotal)+'</td> \n'
            a+= '</tr> \n'
            a+= '</table> \n'
            a+= '</td></tr> \n'
            a+= '</table><br> \n'
            texto = a
            return texto
        
        cadena = '<?xml version="1.0" encoding="utf-8" ?> \n'
        cadena+= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> \n'
        cadena+= '<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> \n'
        cadena+= '<head> \n'
        cadena+= '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> \n'
        cadena+= '<meta name="generator" content="Docutils 0.4.1: http://docutils.sourceforge.net/" /> \n'
        cadena+= '<title>Sussan Boutique</title> \n'
        cadena+= '</head> \n'
        cadena+= '<body> \n'

        cadena = encabezadoPagina(cadena)
        cadena = encabezadoTabla(cadena)
        f.write(cadena)

        renglon = 0
        tipoDoc = str(self.comboBox2.GetSelection())

        totalProductos = 0
        totalSubtotal = Decimal("0.00")
        totalIVA = Decimal("0.00")
        totalTotal = Decimal("0.00")
        orden = 0
        
        for fila in listaFilas:
        #Cod Art Prov,Cod Sussan,Descri,Cant,CtoUnit,Subtotal,Iva,Total,PrecioVenta
        #0            1          2      3    4       5        6   7     8
            if not "*" in self.grid1.GetCellValue(fila,0):
                continue
            orden+= 1
            codartproveedor = (self.grid1.GetCellValue(fila,0)).replace("*","")
            codsussan = self.grid1.GetCellValue(fila,1)
            if codsussan == "DEV": codsussan = ""
            descripcion = self.grid1.GetCellValue(fila,2)
            cantidad = int(self.grid1.GetCellValue(fila,3))
            totalProductos+= cantidad

            cantidad = Decimal(self.grid1.GetCellValue(fila,3))
            costounitario = Decimal(self.grid1.GetCellValue(fila,4))
            subtotal = Decimal(self.grid1.GetCellValue(fila,5)).quantize(Decimal("0.10"))
            iva = Decimal(self.grid1.GetCellValue(fila,6)).quantize(Decimal("0.10"))
            subtotaliva = cantidad*iva
            total = subtotal+subtotaliva
            
            totalSubtotal+= subtotal
            totalIVA+= subtotaliva
            totalTotal+= total
        
            cadena = '<tr> \n'
            cadena+= '<td valign="top" align="right">'+str(orden)+'</td> \n'
            cadena+= '<td valign="top" align="right">'+codartproveedor+'</td> \n'
            cadena+= '<td valign="top" align="left">'+codsussan+'</td> \n'
            cadena+= '<td valign="center" align="left"><font size="2.5">'+descripcion+'</font></td> \n'
            cadena+= '<td valign="top" align="right">'+str(cantidad)+'</td> \n'
            cadena+= '<td valign="top" align="right">'+str(costounitario)+'</td> \n'
            cadena+= '<td valign="top" align="right">'+str(subtotal)+'</td> \n'
            tipoDoc = str(self.comboBox2.GetSelection())
            if tipoDoc in ["0","2","4","5"]:
                cadena+= '<td valign="top" align="right">'+str(subtotaliva)+'</td> \n'
                cadena+= '<td valign="top" align="right">'+str(total)+'</td> \n'
            cadena+= '</tr>\n'
            f.write(cadena)
            
            renglon+= 1
            
            if renglon == totalItemPorPagina :
                cadena = '</table> \n'
                cadena = piePagina(totalProductos,totalSubtotal,totalIVA,totalTotal)
                renglon = 0
                numeroPagina+= 1
                cadena = encabezadoPagina("")
                cadena = encabezadoTabla(cadena)
                f.write(cadena)
                f.write("</table><!-- salto de pagina -->\n")
                f.write("<p STYLE='page-break-after: always;'></p>\n")

        cadena = '</table> \n'
        cadena = piePagina(totalProductos,totalSubtotal,totalIVA,totalTotal)

        f.write(cadena)
        f.close()

        try:
            import os
            os.system("taskkill /IM firefox.exe /F")
            os.system("c:\\explorer.lnk c:\\erpsussan.doc\\reporte-devoluciones.html")
        except:
            texto = "No pudo imprimirse la devolucion\n"
            texto+= "Intente por la opcion Listar Devoluciones o abra"
            texto+= "el navegador y busque reporte-devoluciones.html"
            utiles.mensaje(None,texto)

        #grabando en archivos
        fecha = utiles.obtenerFecha("Y-m-d")
        idproveedor = self.inproveedor.GetLabel()
        tipoDoc = str(self.comboBox2.GetSelection())
        interno = "0" # no es movimiento interno
        if self.checkBox1.GetValue():
            interno = "1" #es movimiento interno        
        if tipoDoc in ["0","1","2","4","5"]:
            total1 = str(totalTotal)
            total2 = "0.00"
            en1oen2 = "1"
        else:
            total1 = "0.00"
            total2 = str(totalTotal)
            en1oen2 = "2"
        nrofactura = self.nro_factura.GetLabel()
        cantprendas = str(totalProductos)
        #miObservacion = self.textCtrl3.GetLabel()
        miObservacion = self.observaciones
        temporada = self.comboBox1.GetLabel()
        
        r1 = "INSERT INTO comprasaldos ( \n"
        r2 = "    idoperacion,fecha,idproveedor, \n"
        r3 = "    monto1,monto2,tipodoc, \n"
        r4 = "    nrofactura,cantproductos,idforma1o2, \n"
        r5 = "    observaciones,operador,temporada, \n"
        r6 = "    interno) \n"
        r7 = "VALUES ( \n"
        r8 = "'%s', '%s', '%s', \n" % ("DEVOLUCION",fecha,idproveedor)
        r9 = "'%s', '%s', '%s', \n" % (total1,total2,tipoDoc)
        r0 = "'%s', '%s', '%s', \n" % (nrofactura,cantprendas,en1oen2)
        rA = "'%s', '%s', '%s', \n" % (miObservacion,"", temporada)
        rB = "'%s')" % (interno)
        sql = r1+r2+r3+r4+r5+r6+r7+r8+r9+r0+rA+rB
        consultasBD.executaSinCommit(None, sql)

    def OnSaltoTotal(self, event):
        if not self.infechafactura.IsEnabled():
            self.grid1.SetFocus()

    def OnCambiaPorcentaje(self, event):
        self.autosizegrilla()
        self.actualizaSubtotal()
        try:
            porcentaje = Decimal(self.choice1.GetLabel())
            if porcentaje == "21":
                return
        except:
            utiles.mensaje(None,"Debe introducir un valor numerico")
            self.textCtrl3.SetLabel("")
            self.textCtrl3.SetFocus()
            return
        try:
            totaltotal = Decimal(str(self.intotal.GetLabel())).quantize(Decimal("0.10"))
        except:
            return
        subtotalsiniva = (totaltotal/Decimal("1.21")).quantize(Decimal("0.10"))
        ivaporcentaje = (subtotalsiniva*porcentaje/Decimal("100.00")).quantize(Decimal("0.10"))
        subtotalconporcentaje = subtotalsiniva+ivaporcentaje
        subtotalsiniva = (subtotalconporcentaje/Decimal("1.21")).quantize(Decimal("0.10"))
        nuevoiva = (subtotalsiniva*Decimal("0.21")).quantize(Decimal("0.10"))
        subtotalconiva = subtotalsiniva+nuevoiva

        self.insubtotal.SetLabel(str(subtotalsiniva))
        self.textCtrl9.SetLabel(str(subtotalsiniva))
        self.iniva.SetLabel(str(nuevoiva))
        self.textCtrl4.SetLabel(str(nuevoiva))
        self.intotal.SetLabel(str(subtotalconiva))
        self.textCtrl5.SetLabel(str(subtotalconiva))
        self.textCtrl7.SetLabel("0.00")
        self.textCtrl8.SetLabel("0.00")

        self.OnDescuentoPerderFoco(None)

    def OnCheckBox1Help(self, event):
        texto = "Si se tilda, este documento no se considera\n"
        texto+= "para calcular el saldo del proveedor"
        utiles.mensaje(None,texto)

    def OnKillObservaciones(self, event):
        aux = self.textCtrl3.GetLabel()
        self.textCtrl3.SetLabel(aux.upper())

    def OnRecalculaIVA(self, event):
        iva = Decimal("0.00")
        try:
            iva = Decimal(self.textCtrl4.GetLabel()).quantize(Decimal("0.10"))
            self.textCtrl4.SetLabel(str(iva))
        except:
            self.textCtrl4.SetLabel("0.00")
            self.button2.SetFocus()
        if iva == Decimal("0.00"):
            return
        
        subtotalSinIVA = Decimal(self.insubtotal.GetLabel()).quantize(Decimal("0.10"))
        subtotalConIVA = subtotalSinIVA + iva
        self.intotal.SetLabel(str(subtotalConIVA.quantize(Decimal("0.10"))))

        nuevoPorcentajeIVA = (iva/subtotalSinIVA*Decimal("100.00")).quantize(Decimal("0.10"))
        if not str(nuevoPorcentajeIVA) in self.choice1.GetItems():
            self.choice1.Append(str(nuevoPorcentajeIVA))
        listaItems = self.choice1.GetItems()
        indice = listaItems.index(str(nuevoPorcentajeIVA))
        self.choice1.SetSelection(indice)
        self.iniva.SetLabel(str(iva))

        porcentajeDescuento = Decimal("0.00")
        try:
            porcentajeDescuento = Decimal(self.indesc.GetLabel()).quantize(Decimal("0.10"))
        except:
            self.indesc.SetLabel("0.00")

        montoDescuento = Decimal("0.00")
        if porcentajeDescuento != Decimal("0.00"):
            montoDescuento = subtotalConIVA*porcentajeDescuento/Decimal("100.00")
            montoDescuento = montoDescuento.quantize(Decimal("0.10"))
            self.textCtrl6.SetLabel(str(montoDescuento))
            
        totaltotal = subtotalConIVA - montoDescuento
        totaltotal = totaltotal.quantize(Decimal("0.10"))
        self.totaltotal.SetLabel(str(totaltotal))

    def OnRecalculaSubtotal(self, event):
        subtotalConIVA = Decimal("0.00")
        try:
            subtotalConIVA = Decimal(self.textCtrl5.GetLabel()).quantize(Decimal("0.10"))
            self.textCtrl5.SetLabel(str(subtotalConIVA))
        except:
            self.textCtrl5.SetLabel("0.00")
            self.button2.SetFocus()
        if subtotalConIVA == Decimal("0.00"):
            return
        self.intotal.SetLabel(self.textCtrl5.GetLabel())
        
        porcentajeDescuento = Decimal("0.00")
        try:
            porcentajeDescuento = Decimal(self.indesc.GetLabel()).quantize(Decimal("0.10"))
        except:
            self.indesc.SetLabel("0.00")

        montoDescuento = Decimal("0.00")
        if porcentajeDescuento != Decimal("0.00"):
            montoDescuento = subtotalConIVA*porcentajeDescuento/Decimal("100.00")
            montoDescuento = montoDescuento.quantize(Decimal("0.10"))
            self.textCtrl6.SetLabel(str(montoDescuento))
            
        totaltotal = subtotalConIVA - montoDescuento
        totaltotal = totaltotal.quantize(Decimal("0.10"))
        self.totaltotal.SetLabel(str(totaltotal))

    def OnRecalculaDescuento(self, event):
        montoDescuento = Decimal("0.00")
        try:
            montoDescuento = Decimal(self.textCtrl6.GetLabel()).quantize(Decimal("0.10"))
            self.textCtrl6.SetLabel(str(montoDescuento))
        except:
            self.textCtrl6.SetLabel("0.00")
            self.button2.SetFocus()
        if montoDescuento == Decimal("0.00"):
            return
        subtotalConIVA = Decimal(self.intotal.GetLabel()).quantize(Decimal("0.10"))
        porcentajeDescuento = (montoDescuento/subtotalConIVA*Decimal("100.00")).quantize(Decimal("0.10"))
        self.indesc.SetLabel(str(porcentajeDescuento))
        totaltotal = subtotalConIVA - montoDescuento
        self.totaltotal.SetLabel(str(totaltotal))
        self.button2.SetFocus()

    def OnDescSinIVAporcentaje(self, event):
        porcentaje = Decimal("0.00")
        try:
            porcentaje = Decimal(self.textCtrl7.GetLabel()).quantize(Decimal("0.10"))
            self.textCtrl7.SetLabel(str(porcentaje))
        except:
            self.textCtrl7.SetLabel("0.00")
            self.iniva.SetFocus()
            return
        if porcentaje == Decimal("0.00"):
            return
        subtotalsinIVA = Decimal(self.textCtrl9.GetLabel()).quantize(Decimal("0.10"))
        montoDescuentoSinIVA = (subtotalsinIVA*porcentaje/Decimal("100.00")).quantize(Decimal("0.10"))
        subtotalsinIVAconDescuento = subtotalsinIVA-montoDescuentoSinIVA
        subtotalsinIVAconDescuento = subtotalsinIVAconDescuento.quantize(Decimal("0.10"))
        self.textCtrl8.SetLabel(str(montoDescuentoSinIVA))
        self.insubtotal.SetLabel(str(subtotalsinIVAconDescuento.quantize(Decimal("0.10"))))
        porcentajeIVA = Decimal(self.choice1.GetLabel()).quantize(Decimal("0.10"))
        montoIVA = subtotalsinIVAconDescuento*porcentajeIVA/Decimal("100.00")
        montoIVA = montoIVA.quantize(Decimal("0.10"))
        subtotalconIVA = subtotalsinIVAconDescuento+montoIVA
        subtotalconIVA = subtotalconIVA.quantize(Decimal("0.10"))
        self.iniva.SetLabel(str(montoIVA))
        self.textCtrl4.SetLabel(str(montoIVA))
        self.intotal.SetLabel(str(subtotalconIVA))
        self.textCtrl5.SetLabel(str(subtotalconIVA))
        porcentajeDescuento = Decimal(self.indesc.GetLabel()).quantize(Decimal("0.10"))
        montoDescuento = (subtotalconIVA*porcentajeDescuento/Decimal("100.00")).quantize(Decimal("0.10"))
        totaltotal = subtotalconIVA+montoDescuento
        totaltotal = totaltotal.quantize(Decimal("0.10"))
        self.textCtrl6.SetLabel(str(montoDescuento))
        self.totaltotal.SetLabel(str(totaltotal))

    def OnDescSinIVAmonto(self, event):
        montoDescuentoSinIVA = Decimal("0.00")
        try:
            montoDescuentoSinIVA = (Decimal(self.textCtrl8.GetLabel())).quantize(Decimal("0.10"))
            self.textCtrl8.SetLabel(str(montoDescuentoSinIVA))
        except:
            self.textCtrl8.SetLabel("0.00")
            self.iniva.SetFocus()
        if montoDescuentoSinIVA == Decimal("0.00"):
            return
        subtotalsinIVA = Decimal(self.textCtrl9.GetLabel()).quantize(Decimal("0.10"))
        porcentaje = (montoDescuentoSinIVA/subtotalsinIVA*Decimal("100.00")).quantize(Decimal("0.10"))
        subtotalsinIVAconDescuento = subtotalsinIVA-montoDescuentoSinIVA
        subtotalsinIVAconDescuento = subtotalsinIVAconDescuento.quantize(Decimal("0.10"))
        self.textCtrl7.SetLabel(str(porcentaje))
        self.insubtotal.SetLabel(str(subtotalsinIVAconDescuento.quantize(Decimal("0.10"))))
        porcentajeIVA = Decimal(self.choice1.GetLabel()).quantize(Decimal("0.10"))
        montoIVA = subtotalsinIVAconDescuento*porcentajeIVA/Decimal("100.00")
        montoIVA = montoIVA.quantize(Decimal("0.10"))
        subtotalconIVA = subtotalsinIVAconDescuento+montoIVA
        subtotalconIVA = subtotalconIVA.quantize(Decimal("0.10"))
        self.iniva.SetLabel(str(montoIVA))
        self.textCtrl4.SetLabel(str(montoIVA))
        self.intotal.SetLabel(str(subtotalconIVA))
        self.textCtrl5.SetLabel(str(subtotalconIVA))
        porcentajeDescuento = Decimal(self.indesc.GetLabel()).quantize(Decimal("0.10"))
        montoDescuento = (subtotalconIVA*porcentajeDescuento/Decimal("100.00")).quantize(Decimal("0.10"))
        totaltotal = subtotalconIVA+montoDescuento
        totaltotal = totaltotal.quantize(Decimal("0.10"))
        self.textCtrl6.SetLabel(str(montoDescuento))
        self.totaltotal.SetLabel(str(totaltotal))

    def OnCambiaComboTipoDocumento(self, event):
        if self.comboBox2.GetSelection()==4 or \
           self.comboBox2.GetSelection()==5:
               self.checkBox1.SetValue(True)
        else:
            #utiles.mensaje(None,"Verifique si es un documento interno")
            pass

    def OnModificarProducto(self, event):
        import ABMproductos2
        dlg = ABMproductos2.ABMProductos(None)
        try:
            dlg.ShowModal() 
        finally:
            dlg.Destroy()

    def OnSalir(self, event):
        self.Close()

    def OnVerProveedor(self, event):
        idproveedor = self.inproveedor.GetLabel()
        nombreproveedor = self.inNombreProvee.GetLabel()
        if idproveedor == "" or nombreproveedor == "":
            return
        import BuscarProveedores
        dlg = BuscarProveedores.Dialog1(self,idproveedor,nombreproveedor)
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy()

    def OnModificarProveedor(self, event):
        idproveedor = self.inproveedor.GetLabel()
        nombreproveedor = self.inNombreProvee.GetLabel()
        if idproveedor == "" or nombreproveedor == "":
            return
        import ModificarProveedores
        dlg = ModificarProveedores.Dialog1(self,idproveedor,nombreproveedor)
        try:
            dlg.ShowModal()
        finally:
            dlg.Destroy()
